#ifndef _KC_HTML_TAG__H_KC_2010_
#define _KC_HTML_TAG__H_KC_2010_

#include <string>

namespace kc_sf {

class HtmlTree;

class HtmlTag {
public:

	typedef enum {
		OPEN_TAG, CLOSE_TAG, NO_CONTENT_TAG
	} Type;

	explicit HtmlTag(const std::string &text, Type tag_type = OPEN_TAG); // czy tag czy jego tekstowa zawartość - traktowana jak dziecko

	void addTextContent(const std::string &txt) const;

	// ---

	bool isOpenTag() const {
		return (ht_type == OPEN_TAG) ? true : false;
	}

	bool isNoContentTag() const {
		return (ht_type == NO_CONTENT_TAG) ? true : false;
	}

	bool isCloseTag() const {
		return (ht_type == CLOSE_TAG) ? true : false;
	}

	void addTextContent(const std::string &txt);

	// ---

	Type type() const {
		return ht_type;
	}

	const std::string & name() const { // nazwa znacznika HTML lub jego zawartosc
		return ht_name;
	}

	std::string attribute(const std::string &attr_name) const;

	const std::string & value() const {
		return ht_value;
	}

	// ---

	bool operator==(const HtmlTag &tag) const {
		return ht_type == tag.ht_type && ht_name == tag.ht_name && ht_attrs
				== tag.ht_attrs && ht_value == tag.ht_value;
	}

	bool operator!=(const HtmlTag &tag) const {
		return !(*this == tag);
	}

private:

	Type ht_type;
	std::string ht_name; // nazwa taga
	std::string ht_attrs; // nie sparsowane atrybuty
	std::string ht_value; // zawartość taga, jeśli była podzielona na części, to zostaną one sklejone
};

}

#endif // _KC_HTML_TAG__H_KC_2010_
